"""
Infra Cascade Simulator Framework (Demo)
---------------------------------------

说明：
本文件为多系统基础设施耦合失效仿真框架的结构展示 Demo，
不包含真实论文代码与算法细节。

真实实现涉及复杂耦合机制，本版本仅展示：
- 类结构
- 关键函数接口
- 流程逻辑（抽象）

"""

import numpy as np
import pandas as pd


class InfraCascadeSimulator:
    """
    多系统基础设施耦合级联失效模拟器（模糊演示版）

    Attributes
    ----------
    adjacency_matrix : pd.DataFrame
        系统内部邻接矩阵（用于负载传播 - 示例）
    dependency_matrix : pd.DataFrame
        系统间依赖系数矩阵（抽象演示）
    node_attr : pd.DataFrame
        节点属性（系统类型、容量等 — 简化结构）
    """

    def __init__(self, adjacency_matrix, dependency_matrix, node_attr):
        self.adj = adjacency_matrix
        self.dep = dependency_matrix
        self.attr = node_attr.copy()

        # 初始化状态变量
        self.load = self.attr['load'].values.copy()
        self.capacity = self.attr['capacity'].values.copy()
        self.status = np.ones(len(self.attr))  # 1=正常，0=失效（示例）


    # ====================
    # 模块化函数接口
    # ====================

    def apply_initial_failure(self, failed_nodes):
        """设置初始失效节点（示例）"""
        for node in failed_nodes:
            idx = self.attr.index[self.attr['id'] == node][0]
            self.status[idx] = 0
            self.load[idx] = 0

    def redistribute_load(self):
        """
        负载重分配示例（不含真实规则）
        """
        # --- demo placeholder ---
        # 真实逻辑：按剩余容量 / 拓扑邻近性 重分配
        pass

    def update_dependency_effect(self):
        """
        功能依赖退化示例（不含真实公式）
        """
        # --- demo placeholder ---
        pass

    def iterate(self, rounds=5):
        """
        执行级联迭代
        """
        for r in range(rounds):
            print(f"\n▶ Round {r+1}")
            self.redistribute_load()
            self.update_dependency_effect()

            # demo: 随机一个节点失效模拟效果展示
            random_node = np.random.randint(0, len(self.status))
            self.status[random_node] = 0
            self.load[random_node] = 0
            print(f" Node {self.attr['id'].iloc[random_node]} failed (demo)")

    def summary(self):
        """输出系统运行状况示意"""
        print("\n=== System Summary (Demo) ===")
        print(f"Remaining normal nodes: {self.status.sum()}/{len(self.status)}")
